//===============================================================================
// Microsoft Architecture Strategy Team
// LitwareHR - SaaS Sample Application
//===============================================================================
// Copyright  Microsoft Corporation.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===============================================================================
// The example companies, organizations, products, domain names,
// e-mail addresses, logos, people, places, and events depicted
// herein are fictitious.  No association with any real company,
// organization, product, domain name, email address, logo, person,
// places, or events is intended or should be inferred.
//===============================================================================


using System;
using Shp.Runtime.Sitka.ServiceAgent;
using Shp.Runtime.Sitka.ServiceAgent.Entities;
using Shp.Runtime.Sitka.ServiceAgent.Managers;
using Shp.Runtime.Sitka.ServiceAgent.EntityMappers;
using Shp.Runtime.Common;

namespace LitwareHR.Portfolio.DataModel.Sitka.Tests
{
    public class TestableRepositoryFactory : IRepositoryFactory
    {
        private string metadataRepositoryTimeStamp;
        private Guid tenantId;

        public TestableRepositoryFactory(Guid tenantId)
        {
            metadataRepositoryTimeStamp = DateTime.Now.ToString("yyyyMMdd-HH:mm:ss:ffff");
            this.tenantId = tenantId;
            CreateMetadataContainer();
        }

        public string MetadataContainerName
        {
            get
            {
                return "MetadataTest_" + metadataRepositoryTimeStamp;
            }
        }

        public void CreateMetadataContainer()
        {
            if (!ContainerManager.ContainerExistsForTenant(MetadataContainerName) )
			{
                ContainerManager.CreateContainer(MetadataContainerName);
            }
        }

        public void CreateTenantContainer()
        {
            if( !ContainerManager.ContainerExistsForTenant( tenantId.ToString() ) )
            {
                ContainerManager.CreateContainer(tenantId.ToString());
            }
        }

        public void DeleteMetadataContainer()
        {
			if (ContainerManager.ContainerExistsForTenant(MetadataContainerName))
			{
				ContainerManager.DeleteContainer(MetadataContainerName);
			}            
        }

        public void DeleteTenantContainer()
        {
			if (ContainerManager.ContainerExistsForTenant(tenantId.ToString()))
			{
				ContainerManager.DeleteContainer(tenantId.ToString());
			}
        }

        public Repository<GenericExtensibleEntity> MetadataRepository
        {
            get
            {
                return new Repository<GenericExtensibleEntity>(MetadataContainerName, new GenericExtensibleEntityMapper());
            }
        }

        public Repository<GenericExtensibleEntity> GetDataRepository(Guid tenantId)
        {
            return new Repository<GenericExtensibleEntity>(tenantId.ToString(), new GenericExtensibleEntityMapper());
        }
    }
}
